"""
这个是管理模块，实现对学生信息的各种操作
"""

from student import Student


class StudentManagerSystem(object):
    """学生管理系统类"""

    def __init__(self):
        self.system_name = '学生管理系统'
        self.students = {}  # 保存所有的学生信息
        self.menu = {
            '1': "添加学生",
            '2': "显示全部",
            '3': "查询学生",
            '4': "修改学生",
            '5': "删除学生\n",
            '6': "导出数据",
            '7': "导入数据\n",
            '0': "退出系统"
        }  # 保存菜单信息

    def start(self):
        """启动管理系统"""
        print(self.system_name, '启动成功', sep='')
        while True:  # 循环执行
            self.__show_menu()  # 显示菜单
            selected_id = input('请输入功能ID：')  # 获取要执行的功能的ID
            if selected_id.isdigit():  # 判断是否为数字
                n = int(selected_id)
                if 0 <= n <= 7:  # 判断是否超出范围
                    self.__operator(selected_id)  # 执行操作方法
                else:
                    print('输入的ID超出范围，请重新输入!')
            else:
                print('输入错误，请重新输入！')

    def __show_menu(self):
        """打印系统菜单"""
        print("*" * 30)
        print("欢迎使用【学生管理系统】 V2.0")
        for key, value in self.menu.items():
            print(key, value, sep='：')
        print("*" * 30)

    def __operator(self, selected_id):
        """对选择的功能调用相应的方法"""
        print('选择的功能是：', self.menu[selected_id], sep='')
        method_dict = {
            '1': self.__add_student,
            '2': self.__show_all_info,
            '3': self.__search_stu_with_id,
            '4': self.__modify_stu_with_id,
            '5': self.__remove_stu_with_id,
            '6': self.__save_data,
            '7': self.__load_data,
            '0': exit
        }  # 保存菜单ID与相应方法的映射关系
        method = method_dict[selected_id]  # 通过字典映射找到相应方法名
        if selected_id == '3' or selected_id == '4' or selected_id == '5':  # 判断函数类型，传入参数
            stu_id = input('请输入学生ID：')
            method(stu_id)
        elif selected_id == '0':
            method(0)
        else:
            method()

    def __add_student(self):
        """添加学生"""
        stu_info = self.__input_stu_info()  # 获取学生信息保存到变量中
        stu = Student(stu_info[0], stu_info[1], stu_info[2])  # 创建学生对象,将信息保存为对象的属性
        self.students[stu.stu_id] = stu  # 通过ID将学生对象存入字典的value中

    def __search_stu_with_id(self, stu_id):
        """通过ID搜索学生信息"""
        stu = None  # 默认为空，表示未找到
        if stu_id in self.students:
            stu = self.students[stu_id]
            print(stu)  # 显示找的的信息
        else:
            print(f'学号为{stu_id}的学生未找到！')
        return stu  # 将学生返回

    def __modify_stu_with_id(self, stu_id):
        """修改学生信息"""
        stu = self.__search_stu_with_id(stu_id)  # 查找学生
        if stu is not None:
            new_stu_info = self.__input_stu_info()  # 从输入获取新的学生信息
            stu.stu_id = new_stu_info[0]
            stu.stu_name = new_stu_info[1]
            stu.stu_age = new_stu_info[2]
            print('修改完成！')
            print(stu)
        else:
            print('要修改的学生不存在！')

    def __remove_stu_with_id(self, stu_id):
        """删除学生信息"""
        stu = self.__search_stu_with_id(stu_id)
        if stu is not None:  # 如果stu不为None，说明找到学生对象
            self.students.pop(stu_id)  # 根据ID删除学生
        else:
            print('要删除的学生不存在！')

    def __show_all_info(self):
        """显示所有学生的信息"""
        for stu in self.students.values():
            print(stu)

    @staticmethod
    def __input_stu_info():
        """从输入中获取一个学生的信息并返回"""
        stu_id = input('请输入学生的学号：')
        stu_name = input('请输入学生的姓名：')
        stu_age = input('请输入学生的年龄：')
        return stu_id, stu_name, stu_age

    def __save_data(self):
        """将学生信息保存到文件中"""
        file_w = open('stu_data', 'w')  # 以写模式打开一个文件
        for stu in self.students.values():  # 遍历所有学生信息
            stu_s = stu.stu_id + '  ' + stu.stu_name + '  ' + stu.stu_age + '\n'  # 转换为字符串对象
            file_w.write(stu_s)  # 写入文件
        file_w.close()  # 关闭文件
        print('数据导出成功！')

    def __load_data(self):
        """从文件中加载学生信息"""
        with open('stu_data', 'r') as file_r:  # 以读模式打开文件
            content = file_r.readlines()  # 读取所有行，保存为列表
            for stu_s in content:  # 遍历列表
                split_info = stu_s.split()  # 去除不要的空白
                stu = Student(split_info[0], split_info[1], split_info[2])  # 创建学生对象
                self.students[stu.stu_id] = stu  # 保存到字典中
        print('数据导入成功！')
